Windows 計劃任務

ok-script 支援把一次性任務(onetime_tasks)註冊為 Windows 計劃任務, 按計劃自動執行。

任務定位機制:-t N

計劃任務通過 -t N 引數定位要執行的任務,其中 N 是 onetime_tasks 列表中的 1-based 索引(例如 -t 1 表示列表第 1 個任務)。

<Arguments>main.py -t 1 -e</Arguments>

任務被建立時,CreateScheduleTaskDialog 用 og.executor.onetime_tasks.index(selected_task) + 1 計算索引並寫入 XML。

索引重排問題

由於定位依賴的是索引而非任務名,一旦 config.py 中 onetime_tasks 的順序發生變化(例如把業務任務前置、測試任務後置),已建立的計劃任務 仍指向舊索引,就會執行到錯誤的任務(例如 -t 15 從「啟動一次遊戲」跑到 TestDemoGraphic)。

啟動時自動校正與穩定標識遷移

為保留 ok 原生 -t 機制、不修改任何執行時解析 / 建立 / 修改對話方塊邏輯, ok-script 在每次啟動時自動校正並把 -t 目標統一遷移為穩定標識 (模組路徑.類名,如 src.tasks.onetime.DailyTask,對排序免疫):

  • 掛載點:MainWindow.__init__(構造 ScheduleTaskTab、載入任務快取之前,早於 start_runtime),原生內聯呼叫
  • 實現:ok/ui/qt/tasks/schedule_index_sync.py(同步邏輯),MainWindow.__init__ 直接呼叫 sync_schedule_task_indexes()
  • 原理:解析快取任務當前的 -t 目標(數字索引 / 歷史任務名 / 模組路徑.類名), 以快取任務名(建立時選擇的任務名,不隨排序變化)或已快取的穩定標識為權威身份, 在當前 onetime_tasks 中定位目標任務,把 -t X 統一改寫為當前實際的 模块路径.类名;同時回填快取的 task_index / task_identifier 後設資料。

校正規則:

  1. 只處理本應用(如 \ok-ef\)下的任務,其它 ok-* 應用的只讀任務不動;
  2. 任務名與穩定標識都無法在當前 onetime_tasks 中唯一定位時跳過(可能已被刪除);
  3. 目標與後設資料均已正確時跳過(冪等,不寫快取、不調 COM);僅缺後設資料時只回填 快取,不重註冊 Windows 任務;
  4. 有變更時同步更新快取 / xml_config / Windows 計劃任務 (COM RegisterTaskDefinition,失敗回退 schtasks /Create /XML /F);
  5. 改寫本次程序 sys.argv 與 og.ok.args['task'],保證本次啟動也使用正確目標;
  6. 每次程序只校正一次(程序級 guard)。

注意:純 headless(無 GUI)的應用不經過 showEvent 掛載點,不會觸發 自動校正,此時請使用下面的一次性工具。

一次性校正工具

當 GUI 無法正常啟動,或需要手動執行校正時,可在應用根目錄執行:

python fix_schedule_task_refs.py
# 或指定配置导入目标
python fix_schedule_task_refs.py --config src.config:config

該工具與啟動時自動校正複用同一實現 (sync_schedule_task_indexes()),列印被修正的任務數。

常見問題

  • 統一為穩定標識:無論歷史格式是數字索引(-t 1)還是任務名 (-t 日常任务),校正都會統一遷移為 模块路径.类名 形式,之後任務排序 變化不再影響計劃任務;執行時按類名回退匹配,模組移動也能自動修正。
  • 其它應用任務:ok-* 其它應用註冊的任務不會被本應用改寫。
在 GitHub 查看來源 ↗ · 頁面產生時間: 2026年11月4日